/*
 * Por cada dı́a, el mejor paı́s es aquél que más medallas de oro ganó.
 * En caso de haber un empate, nos quedaremos con el menor paı́s comparando lexicográficamente (pais mejor < pais otro).
 * Si un dı́a nadie ganó una medalla de oro, ese dı́a se saltea y no aparece en la lista.
 */

Problema 13 uyOrdenadoAsíHayUnPatrón(j:JJOO) = res : Bool

//??
asegura res == True IF |mejoresPaises(j)|==|sinRepes(mejoresPaises(j)))|
//Si el primero esta 1 vez y alguno de los otros se repite => explota a la mierda
asegura res == False IF contar(primero...)==1 && |mejoresPaises(j)|>|sinRepes(mejoresPaises(j)))|


asegura res == 
IF |mejoresPaises(j)|==|sinRepes(mejoresPaises(j)))| then
	true
else
	IF contar(primero...)==1 && |mejoresPaises(j)|>|sinRepes(mejoresPaises(j)))| then
		false
		else
(paratodo i←[0..|mejorespaises(j)|-1], 
                         k←[0..|mejoresPaises(j)|-1],
i mod |patron(mejoresPaises(j))| == k mod |patron(mejoresPaises(j))| )
s[i] == s[k]

//Caso borde: nunca repite el primero => valido siempre?
aux mejoresPaises(j :JJOO) : [Paises] =
[ cab(ordenar(masOrosDelDia(j,d) ) | d ←  [1.. jornadaActual(j) - 1], cronograma(j,d) != [ ], masOrosDelDia(j,d) != [] ]

aux patron(ls: [T]) : [T] = 
	if |ls|==1 then
		ls
	else
	sub(ls, 0, min ( [ i | i <- [1..|ls|-1], ls[i] == ls[0] ] ) )


aux masOrosDelDia( j:JJOO, d: dia) : [pais] =
		filtrarTuplaPorPrmMax(j, uniqSgdLista( tuplasMedallOroComaPais(j,d) ), d)

aux tuplasMedallaOroComaPais(j : JJOO, d: Dia) : [(int, Pais)]
[ ( contar(pais,PaisesConOroTalDia(j,d)), pais ) | pais <- paisesConOroTalDia(j,d) ]

aux paisesConOroTalDia(j:JJOO, d: Dia) : [Pais]
[ pais (cab(ranking(c)) | c ← cronograma (j,d), finalizada(c) && |ranking(c)|>0 ]

\aux{uniqSgdLista}{ls:[(\ent,\ent)]}{[(\ent,\ent)]}
         {[ ls(i) | i \leftarrow [0..|ls|-1], j\leftarrow [0..|ls|-1], i \neq j, sgd(ls[i]) \neq sgd(ls[j]) ]}

	aux filtrarTuplaPorPrmMax(j:JJOO, ls:[(\ent,Pais)], d:Dia) : [Pais]
	[ sgd(tupla) | tupla <- tuplasMedallaOroComaPais(j,d), prm(tupla) >= maxListaTuplas(tuplasMedallaOroComaPais(j,d)) ]

aux maxListaTuplas( ls: [(ent, Pais)]) : ent =
		max([ prm(tupla) | tupla <- ls ])

}

